# AudioFly Docker镜像（CPU推理）
# 使用 Python 3.10 基础镜像（AudioFly 项目要求 Python <= 3.10）
# 注意：AudioFly 使用 CPU 推理，不需要 NPU 相关配置
# 使用官方镜像，自动匹配主机架构（支持 amd64/arm64）
FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/python:3.10-slim-linuxarm64

# 设置工作目录
WORKDIR /app

# 设置环境变量
ENV PYTHONUNBUFFERED=1
ENV DEBIAN_FRONTEND=noninteractive
ENV PYTHONPATH=/app
ENV TORCH_DEVICE_BACKEND_AUTOLOAD=0

# 配置 apt 使用清华源
RUN sed -i 's|http://deb.debian.org|https://mirrors.tuna.tsinghua.edu.cn|g' /etc/apt/sources.list.d/debian.sources 2>/dev/null || \
    sed -i 's|http://archive.ubuntu.com|https://mirrors.tuna.tsinghua.edu.cn|g' /etc/apt/sources.list 2>/dev/null || true

# 安装系统依赖
RUN apt-get update && apt-get install -y \
    libsndfile1 \
    ffmpeg \
    git \
    wget \
    curl \
    build-essential \
    ninja-build \
    && rm -rf /var/lib/apt/lists/*

# 验证Python版本
RUN python3 --version && \
    python3 -m pip --version

# 配置pip使用清华源
RUN python3 -m pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple && \
    python3 -m pip config set global.trusted-host pypi.tuna.tsinghua.edu.cn

# 升级pip、setuptools 和 wheel
RUN python3 -m pip install --upgrade pip setuptools wheel -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn

# 安装 PyTorch（CPU版本，指定版本 2.3.1）
# 注意：torch、torchvision 和 torchaudio 版本必须匹配，否则会出现 operator 不存在的错误
# 先卸载可能存在的旧版本，确保干净安装
RUN python3 -m pip uninstall -y torch torchvision torchaudio 2>/dev/null || true

# 从 PyTorch 官方源同时安装所有包，确保版本匹配
# 使用单个命令同时安装，确保它们从同一个构建源安装
RUN python3 -m pip install --no-cache-dir \
    torch==2.3.1 \
    torchvision==0.18.1 \
    torchaudio==2.3.1 \
    --extra-index-url https://download.pytorch.org/whl/cpu || \
    (echo "警告: 从官方源安装失败，尝试从清华源安装..." && \
     python3 -m pip uninstall -y torch torchvision torchaudio 2>/dev/null || true && \
    python3 -m pip install --no-cache-dir \
     torch==2.3.1 \
     torchvision==0.18.1 \
     torchaudio==2.3.1 \
     -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn) || \
    (echo "错误: PyTorch 安装失败，请检查版本是否存在" && exit 1)

# 验证 PyTorch 安装并测试 torchvision nms 操作符
RUN python3 -c "import torch; import torchvision; import torchaudio; \
print(f'PyTorch 版本: {torch.__version__}'); \
print(f'TorchVision 版本: {torchvision.__version__}'); \
print(f'TorchAudio 版本: {torchaudio.__version__}'); \
from torchvision.ops import nms; \
print('✓ torchvision.ops.nms 可用'); \
import torchvision._meta_registrations; \
print('✓ torchvision._meta_registrations 导入成功'); \
print('✓ PyTorch 安装验证通过')" || \
    (echo "错误: PyTorch 安装或验证失败" && exit 1)

# 复制requirements文件
COPY requirements.txt .

# 安装Python依赖（CPU版本，不需要 torch-npu）
# 注意：requirements.txt 中不包含 torch/torchvision/torchaudio，避免版本冲突
RUN python3 -m pip install --no-cache-dir \
    -r requirements.txt \
    -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn

# 再次验证 PyTorch 版本，确保没有被覆盖
RUN python3 -c "import torch; import torchvision; import torchaudio; \
    assert torch.__version__.startswith('2.3.1'), f'PyTorch 版本不匹配: {torch.__version__}'; \
    assert torchvision.__version__.startswith('0.18.1'), f'TorchVision 版本不匹配: {torchvision.__version__}'; \
    assert torchaudio.__version__.startswith('2.3.1'), f'TorchAudio 版本不匹配: {torchaudio.__version__}'; \
    print('✓ PyTorch 版本验证通过'); \
    print(f'  PyTorch: {torch.__version__}'); \
    print(f'  TorchVision: {torchvision.__version__}'); \
    print(f'  TorchAudio: {torchaudio.__version__}')" || \
    (echo "错误: PyTorch 版本验证失败，可能存在版本冲突" && exit 1)

# 如果AudioFly项目目录中有requirements.txt，也安装其依赖
# 注意：这需要在运行时通过卷挂载提供AudioFly项目目录
# 在启动脚本中处理：如果存在 ${LOCAL_MODEL_PATH}/requirements.txt，则安装

# 复制应用代码
COPY api/ ./api/
COPY config/ ./config/

# 复制启动脚本
COPY entrypoint.sh ./entrypoint.sh
RUN chmod +x ./entrypoint.sh

# 创建必要的目录
RUN mkdir -p /app/models /app/logs /app/result

# 设置权限
RUN chmod -R 755 /app

# 暴露端口
EXPOSE 8000

# 健康检查
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
    CMD curl -f http://localhost:8000/health || exit 1

# 使用启动脚本（会自动安装AudioFly项目依赖）
ENTRYPOINT ["/app/entrypoint.sh"]


